/*
 * Copyright (C) 2006-2012 TongYan Corporation
 * All rights reserved.
 *
 * @brief info:
 *
 * @author: 王哲成 - wangzhecheng@yeah.net
 * @date: 2021.05.20
 * @last modified: 2021-05-20 15:56
 *
 */

#ifndef __MODEL_HEADER__
#define __MODEL_HEADER__

#include "ISGBackAnalysisMethod.hpp"
#include "Param.hpp"
#include <memory>
#include <utility>

class Model {
public:
  Model() = default;
  ~Model() = default;

  // 设置模型待定参数集
  void append(const ParamSet &p) {
    m_ParamSet = p;
    return;
  }
  // 设置模型反分析方法
  void append(std::unique_ptr<ISGBackAnalysisMethod> &&ptr) {
    m_ptrBackAnalysisMethod = std::move(ptr);
    return;
  }
  // 返回反分析方法对象指针
  const ISGBackAnalysisMethod *const getBackAnalysisMethod() const {
    return m_ptrBackAnalysisMethod.get();
  }
  // 设置目标函数
  void append(std::unique_ptr<ISGObjectFunction> &&ptr) {
    m_ptrTarFunc = std::move(ptr);
    return;
  }
  // 返回目标函数对象指针
  const ISGObjectFunction *const getTargetFunction() const {
    return m_ptrTarFunc.get();
  }

  Candidate solve() {
    return m_ptrBackAnalysisMethod->getOptimalSolution(m_ParamSet);
  }

private:
  ParamSet m_ParamSet;
  std::unique_ptr<ISGObjectFunction> m_ptrTarFunc;
  std::unique_ptr<ISGBackAnalysisMethod> m_ptrBackAnalysisMethod;
};

#endif
